/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Principal;

import java.awt.Color;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author Tesla
 */
public class local_connection {

    static Properties propiedades;
    static jcProperties editarPropiedades;
    public static Connection cn;

    public local_connection() {
        DriverManager.setLoginTimeout(1);
        connectMethod(0,15000);
    }

    public static void connectMethod(int t,int tiempo) {
        while (cn == null) {
            try {
                editarPropiedades = new jcProperties();
                if (editarPropiedades.getProperties() == null) {
                    editarPropiedades.crearPropiedades();
                }
                propiedades = new Properties();
                propiedades = editarPropiedades.getProperties();
                cn = (Connection) DriverManager.getConnection("jdbc:mysql://" + propiedades.getProperty("serverLocal") + "/" + propiedades.getProperty("baseDatosLocal") + "?connectTimeout="+tiempo+"&socketTimeout="+tiempo+"&zeroDateTimeBehavior=convertToNull&autoReconnect=true", propiedades.getProperty("usuarioLocal"), propiedades.getProperty("passLocal"));
              //cn.setNetworkTimeout(null, 60000);
                if(t!=0) trabajarLocal(false); else VentanaPrincipal.local=false;
            } catch (SQLException ex) {
                Object[] options = {"Cambiar configuracion", "Entrar local", "Salir"};
                int n = JOptionPane.showOptionDialog(VentanaPrincipal.getFrames()[0], "Imposible establecer conexion con servidor\n¿Que desea hacer?",
                        "Error",
                        JOptionPane.YES_NO_CANCEL_OPTION,
                        JOptionPane.ERROR_MESSAGE,
                        null,
                        options,
                        options[1]);
                switch (n) {
                    case (0):
                        miconexion = new cambiarConexion(null, true);
                        miconexion.setVisible(true);
                        break;
                    case (1):
                        if(t!=0) trabajarLocal(true); else VentanaPrincipal.local=true;
                        try {
                            cn = (new cache_connection()).getconnect();
                        } catch (SQLException ex1) {
                            VentanaPrincipal.logger.log(Level.SEVERE, null, ex1);
                        }

                        break;
                    case (2):
                    default:
                        System.exit(0);
                        break;
                }
            }
        }
    }

    public static void reconnect(int tiempo) {
        cn = null;
        connectMethod(1,tiempo);
    }
    

    public static void checkConnection() {
        if (VentanaPrincipal.local) {
            try {
                cn = null;
                cn = (Connection) DriverManager.getConnection("jdbc:mysql://" + propiedades.getProperty("serverLocal") + "/" + propiedades.getProperty("baseDatosLocal") + "?connectTimeout=3000&socketTimeout=3000&zeroDateTimeBehavior=convertToNull&autoReconnect=true", propiedades.getProperty("usuarioLocal"), propiedades.getProperty("passLocal"));
                //cn.setNetworkTimeout(null, 60000);
                volcarDatos();
            } catch (SQLException ex) {
                try {
                    cn = cache_connection.getconnect();
                    trabajarLocal(true);
                } catch (SQLException ex1) {
                    VentanaPrincipal.logger.log(Level.SEVERE, null, ex1);
                }
            }
        } else {
            try {
                PreparedStatement ps = cn.prepareStatement("do 1");
                ps.setQueryTimeout(1);
                ps.execute();
            } catch (SQLException ex) {
                reconnect(15000);
            }
        }

    }

    public static void volcarDatos() {
        Object[] options = {"No", "Si"};
        int n = JOptionPane.showOptionDialog(VentanaPrincipal.getFrames()[0],
                "Se ha reestablecido la conexion al servidor\n¿Desea actualizar la base de datos?",
                "Conexion reestablecida",
                JOptionPane.YES_NO_OPTION,
                JOptionPane.QUESTION_MESSAGE,
                null,
                options,
                options[1]);
        if(n==0)try {
            cn=cache_connection.getconnect();
            trabajarLocal(true);
        } catch (SQLException ex) {
            VentanaPrincipal.logger.log(Level.SEVERE, null, ex);       
        }
        else{
           Thread dato = new Thread(new actualizarThread());
                        dato.start();
        }
    }

    public static Connection getconnect() throws SQLException {
        return cn;
    }

    public static void trabajarLocal(boolean local) {
        VentanaPrincipal.local = local;
        
        if (local) {
            PanelVentas.conexion.setText("Local");
            PanelVentas.conexion.setBackground(Color.red);
        } else {
            PanelVentas.conexion.setText("En Red");
            PanelVentas.conexion.setBackground(Color.green);
        }
    }
    static cambiarConexion miconexion;
}
